跳到主要内容

Rust 哈希表

阐述

哈希表是一一映射的键值对的集合,类型为 HashMap<K, V>,并且可以动态改变大小。

实例

跟 Vec 一样,如果预先知道要存储的 KV 对个数,可以使用 HashMap::with_capacity(capacity)创建指定大小的 HashMap,避免频繁的内存分配和拷贝,提升性能。

通过 collect 创建

let teams_map: HashMap<_,_> = teams_list.into_iter().collect();

性质

所有权

对于键 K 和值 V 来说,

  • 若类型实现 Copy 特征,该类型会被复制进 HashMap,因此无所谓所有权
  • 若没实现 Copy 特征,所有权将被转移给 HashMap 中

另外,也可以考虑在哈希表中存储引用,但是这时候必须保证引用的生命周期比哈希表长。

查询

查询使用 .get() 函数,返回 Option<&V> 类型。

更新

可以通过 .entry(key).or_insert() 的方式来在不存在的情况下插入值。

哈希函数的选择

目前,哈希表使用的哈希函数是 SipHash,性能不是很高,尤其是对于小型的 Key 或者大型的 Key。可以指定哈希函数使用第三方的哈希函数:

let mut hash: HashMap<_, _, BuildHasherDefault<XxHash64>> = Default::default();

性能很好的第三方库包括 rustc-hashahash

相关内容

参考文献